24 块设备
/dev devtmpfs 文件系统
mount 块设备文件挂载
bdev 伪文件系统
块设备工作过程
- 所有的块设备被一个 map 结构管理从 dev_t 到 gendisk 的映射;
- 所有的 block_device 表示的设备或者分区都在 bdev 文件系统的 inode 列表中;
- mknod 创建出来的块设备文件在 devtemfs 文件系统里面,特殊 inode 里面有块设备号;
- mount 一个块设备上的文件系统,调用这个文件系统的 mount 接口;
- 通过按照 /dev/xxx 在文件系统 devtmpfs 文件系统上搜索到特殊 inode,得到块设备号;
- 根据特殊 inode 里面的 dev_t 在 bdev 文件系统里面找到 inode;
- 根据 bdev 文件系统上的 inode 找到对应的 block_device,根据 dev_t 在 map 中找到 gendisk,将两者关联起来;
- 找到 block_device 后打开设备,调用和 block_device 关联的 gendisk 里面的 block_device_operations 打开设备;
- 创建被 mount 的文件系统的 super_block。
直接 I/O 访问块设备
在 ext4_direct_IO_write 调用 __blockdev_direct_IO,通过当前文件的 inode 得到 super_block。
缓存 I/O 访问块设备
在 ext4_writepages 中,mpage_prepare_extent_to_map 用于初始化 struct mpage_da_data 结构。调用链为:mpage_prepare_extent_to_map->mpage_process_page_bufs->mpage_submit_page->ext4_bio_write_page->io_submit_add_bh。
向块设备层提交请求
submit_bio 会调用 generic_make_request。在 do-while 中获取一个请求队列 request_queue,然后调用队列的 make_request_fn 函数。